package stack.stackSimulationCalculate;

/**
 * @author： pang-yun
 * @date： 2021-08-27 16:14
 * 功能目的 ：用于  栈模拟计算
 *
 * 使用栈完成表达式的计算思路
 * - 首先创建两个栈  一个是 数字栈  一个是 符号栈
 * - 创建一个 index 值，来遍历我们的表达式
 * - 如果是一个数字 就直接入数字栈
 * - 如果是符号栈   当符号栈为空时 ， 就直接入栈   如果符号栈不为空时： 就进行比较。如果当前的操作符优先级 小于或者等于栈中的操作符，就需要从数栈中pop出两个数字 从符号栈中pop出一个符号
 *                              进行运算 将结果放入数栈  然后将当前的操作符 入 符号栈  如果当前操作符的优先级大于栈中的符号 就直接入符号栈
 * - 扫描完毕之后 就顺序从 数栈 和 符号栈 中 pop 出相应的符号， 并运行
 */

public class StackSimulationCalculate {

        //首先来一个表达式



    static class ArrayCalculateStack {
        private int maxSize; //最大值
        private int[] stack; // 存放数据的栈
        private int top = -1; // 栈顶  初始值为-1

        public ArrayCalculateStack (int maxSize) {
            this.maxSize = maxSize;
            stack = new int[maxSize];
        }

        //栈满
        public boolean isFull() {
            return top == maxSize - 1;
        }

        //是否为空
        public boolean isEmpty() {
            return top == -1;
        }

        //入栈
        public void push(int value) {
            if (isFull()) {
                System.out.println("已满");
                return;
            }
            top++;
            stack[top] = value;
        }

        //弹出
        public int pop() {
            if (isEmpty()) {
                System.out.println("为空！");
                throw new RuntimeException("为空！");
            }
            int i = stack[top];
            System.out.println("弹出： " + stack[top]);
            top--;
            return i;

        }

        //遍历
        public void list() {
            if (isEmpty()) {
                System.out.println("empty");
                return;
            }
            for (int i = top; i >= 0; i--) {
                System.out.println(stack[i]);
            }
        }

        // 返回运算符的优先级 用数字表示 数字越大 优先级越高
        public int priority(int operation){
            if (operation == '*' || operation=='/'){
                return 1;
            }else if (operation=='+' || operation=='-'){
                return 0;
            }else {
                return -1;  // 有问题
            }
        }
        //判断是不是一个运算符
        public boolean isOperation(char val){
            return val=='+' || val=='-'  || val=='*' || val=='%';
        }
        // 计算方法
        public int calculate(int num1, int num2 , int operation){
            int res=0;
            switch (operation){
                case '+':
                    res=num2+num1;
                    break;
                case '-':
                    res=num2-num1;
                    break;
                case '*':
                    res=num2*num1;
                    break;
                case '%':
                    res=num2%num1;
                    break;
                default:
                    break;
            }
            return res;
        }

    }

}
